import {Timestamp, TS} from "./Timestamp.ts";

export interface NoticeRaw {
    [key: number]: number | string
}

export interface NoticeBodyRaw {
    // 回复提醒，含礼物
    0: NoticeRaw[]
    // 私信提醒
    1: NoticeRaw[]
    // 点赞提醒
    2: NoticeRaw[]
    // 预留
    3: NoticeRaw[]
    // 预留
    4: NoticeRaw[]
    // 获得时间，下一次查询的offset参数
    lasttime: number
}


export interface Notice {
    type: number
    fromUid: number | undefined
    fromUname: string | undefined
    toUid: number
    toUname: string | undefined
    // 文本1： 通常为主题标题
    text: string | undefined
    // 相关ID1： 通常为主题ID，私信ID
    aboutId: number | undefined
    // 相关ID2： 通常为回复ID
    aboutId2: number | undefined
    aboutId3: number | undefined
    aboutId4: number | undefined
    time: Timestamp | undefined
    text2: string | undefined
    text3: string | undefined
    unread: boolean
}

export interface NoticeBody {
    replies: Notice[] | undefined
    messages: Notice[] | undefined
    likes: Notice[] | undefined
    offset: number
    timestamp: Timestamp | undefined
}

export const buildNotice = (data: NoticeRaw): Notice => {
    return {
        type: Number(data[0]),
        fromUid: data[1] ? Number(data[1]) : undefined,
        fromUname: data[2]?.toString(),
        toUid: Number(data[3]),
        toUname: data[4]?.toString(),
        text: data[5]?.toString(),
        aboutId: data[6] ? Number(data[6]) : undefined,
        aboutId2: data[7] ? Number(data[7]) : undefined,
        aboutId3: data[8] ? Number(data[8]) : undefined,
        time: TS(Number(data[9])),
        aboutId4: data[10] ? Number(data[10]) : undefined,
        text2: data[11]?.toString(),
        text3: data[13]?.toString(),
        unread: true
    }
}

export const buildNoticeBody = (data: NoticeBodyRaw): NoticeBody => {
    const replies = data[0]?.map(buildNotice)?.reverse();
    const messages = data[1]?.map(buildNotice)?.reverse();
    const likes = data[2]?.map(buildNotice)?.reverse();
    const t0 = replies?.[0]?.time?.seconds || 0
    const t1 = messages?.[0]?.time?.seconds || 0
    const t2 = likes?.[0]?.time?.seconds || 0
    const maxTime = Math.max(t0, t1, t2);

    return {
        replies, messages, likes,
        offset: maxTime > 0 ? maxTime : data.lasttime,
        timestamp: TS(data.lasttime)
    }
}


// 提醒消息类型
export enum NoticeType {
    /**
     * 回复你的主题
     */
    REPLY_TOPIC = 1, // "回复", { msg -> "${msg.fromUname} 回复[${msg.aboutId2}]了你的主题 ${msg.text}" }),

    /**
     * 回复你的回复
     */
    REPLY_REPLY = 2, // "回复", { msg -> "${msg.fromUname} 回复[${msg.aboutId2}]了你在主题 ${msg.text} 中的回复[${msg.aboutId3}]" }),

    /**
     * 评论你的主题
     */
    COMMENT_TOPIC = 3, // "回复", { msg -> "${msg.fromUname} 评论了你的主题 ${msg.text}" }),

    /**
     * 评论你的回复
     */
    COMMENT_REPLY = 4, // "回复", { msg -> "${msg.fromUname} 评论[${msg.aboutId2}]了你在主题 ${msg.text} 中的回复[${msg.aboutId3}]" }),

    /**
     * 触发了关键词监视(主题)
     */
    KEYWORD_WATCH_TOPIC = 5, // "管理", { msg -> "${msg.fromUname} 发布的主题 ${msg.text} 触发了关键词监视" }),

    /**
     * 触发了关键词监视(回复)
     */
    KEYWORD_WATCH_REPLY = 6, // "管理", { msg -> "${msg.fromUname} 在主题 ${msg.text} 中的回复[${msg.aboutId2}] 触发了关键词监视" }),

    /**
     * 在主题中@你
     */
    MENTION_TOPIC = 7, // "回复", { msg -> "${msg.fromUname} 在主题 ${msg.text} 中提到了你" }),

    /**
     * 在回复中@你
     */
    MENTION_REPLY = 8, // "回复", { msg -> "${msg.fromUname} 在主题 ${msg.text} 中的回复[${msg.aboutId2}] 中提到了你" }),

    /**
     * 你的帐号可能记录到新的IP
     */
    IP_CHANGE = 9, // "管理", { _ -> "你的帐号可能记录到新的IP" }),

    /**
     * 发起新的私信
     */
    MESSAGE_NEW = 10, // "私信", { msg -> "${msg.fromUname} 发起了新会话[${msg.aboutId}]" }),

    /**
     * 回复私信
     */
    MESSAGE_REPLY = 11, // "私信", { msg -> "${msg.fromUname} 回复了会话[${msg.aboutId}]" }),

    /**
     * 私信邀请新用户
     */
    MESSAGE_ADD = 12, // "私信", { msg -> "${msg.fromUname} 邀请了新用户加入会话[${msg.aboutId}]" }),

    /**
     * 举报主题
     */
    REPORT_TOPIC = 13, // "管理", { msg -> "${msg.fromUname} 举报了主题 ${msg.text} 理由: ${msg.text2}" }),

    /**
     * 举报回复
     */
    REPORT_REPLY = 14, // "管理", { msg -> "${msg.fromUname} 举报了主题 ${msg.text} 中的回复[${msg.aboutId2}] 理由: ${msg.text2}" }),

    /**
     * 评价了你的发言(礼物)
     */
    RECOMMEND_POST = 15, // "评价", { msg ->msg.aboutId2?.let { "${msg.fromUname} 评价了你在主题 ${msg.text} 中的回复[${msg.aboutId2}] 并使用了道具" }?: "${msg.fromUname} 评价了你的主题 ${msg.text} 并使用了道具"} ),

    /**
     * 某版面中的发帖触发了关键词监视
     */
    KEYWORD_WATCH = 16, // "管理", { _ -> "描述生成方法未实现" }),

    /**
     * 获得了支持或反对
     */
    UPVOTE = 17, // "评价", { msg -> msg.aboutId2?.let { "你在主题 ${msg.text} 中的回复[${msg.aboutId2}] 获得了支持或反对" } ?: "你的主题 ${msg.text} 获得了支持或反对" }),

}